package com.tbit.main.dao.core;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tbit.main.pojo.*;
import com.tbit.main.pojo.VO.GetDataVO;
import com.tbit.main.pojo.VO.RideLogReqVO;
import com.tbit.main.pojo.dto.TodoItemsDTO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 骑行记录
 *
 * @author Leon
 * 2019年11月11日 上午9:11:49
 */
public interface RideLogDao {

    /**
     * 查询设备最后一个订单
     *
     * @param machineId
     * @return
     */
    RideLog findLastByMachineId(Integer machineId);

    /**
     * 根据时间统计
     *
     * @param params
     * @return
     */
    RideSta staByTime(Map<String, Object> params);

    /**
     * 根据时间统计
     *
     * @param params
     * @return
     */
    RideSta staRegionIdByTime(Map<String, Object> params);

    /**
     * 根据时间统计,运营区域集合
     *
     * @param params
     * @return
     */
    RideSta staByTimeByAccountIds(Map<String, Object> params);

    /**
     * 根据时间统计,运营区域集合,分组
     *
     * @param params
     * @return
     */
    List<RideSta> staByTimeByAccountIdsGroup(Map<String, Object> params);

    /**
     * 运营区域统计
     *
     * @param accountId
     * @return
     */
    RideSta staByAccountId(Integer accountId);

    /**
     * 统计未支付订单
     *
     * @param params
     * @return
     */
    RideSta staNotPayByTime(Map<String, Object> params);

    /**
     * 统计补交订单
     *
     * @param params
     * @return
     */
    RideSta staAfterPayByTime(Map<String, Object> params);

    /**
     * 根据订单号查询
     *
     * @param orderNO
     * @return
     */
    RideLog getByOrderNO(String orderNO);

    /**
     * 根据订单号批量查询
     *
     * @param orderNOs
     * @return
     */
    List<RideLog> getByOrderNOs(Map<String, Object> orderNOs);

    /**
     * 添加调度费用日志
     *
     * @param orderDispatchLog
     */
    void addDispatchLog(OrderDispatchLog orderDispatchLog);

    /**
     * 骑行时段统计
     *
     * @param params
     * @return
     */
    List<KVEntity> staRideTime(Map<String, Object> params);

    /**
     * 按天统计订单数量
     *
     * @param params
     * @return
     */
    List<KVEntity> orderCountGroupByDate(Map<String, Object> params);

    /**
     * 按天统计订单金额
     *
     * @param params
     * @return
     */
    List<KVEntity> orderMoneyGroupByDate(Map<String, Object> params);

    /**
     * 借出站点总数统计
     *
     * @param params
     * @return
     */
    Integer statByStartParkCount(Map<String, Object> params);

    /**
     * 归还站点总数统计
     *
     * @param params
     * @return
     */
    Integer statByEndParkCount(Map<String, Object> params);

    /**
     * 借出站点分页
     *
     * @param params
     * @return
     */
    List<StatPark> statByStartPark(Map<String, Object> params);

    /**
     * 归还站点分页
     *
     * @param params
     * @return
     */
    List<StatPark> statByEndPark(Map<String, Object> params);

    /**
     * 根据品牌查询所有订单信息
     *
     * @param accountId
     * @return
     */
    RideSta getByAccountId(Integer accountId);

    /**
     * 根据运营区域批量查询所有订单信息
     *
     * @param map
     * @return
     */
    RideSta getByAccountIds(Map<String, Object> map);

    /**
     * 根据用户码查询
     *
     * @param map
     * @return
     */
    List<RideLog> getByMachineId(Map<String, Object> map);

    /**
     * 获取在骑订单
     *
     * @return
     */
    List<RideLog> getBorrow();

    /**
     * 根据运营区域按天分组
     *
     * @param params
     * @return
     */
    List<Map<String, Object>> getGroupByDay(Map<String, Object> params);

    /**
     * 查询里程新增
     *
     * @param params
     * @return
     */
    Integer newMileage(Map<String, Object> params);

    /**
     * 统计前一天的数据
     *
     * @return
     */
    Map<String, Object> statYesterdayOrder(Map<String, Object> params);

    /**
     * 查询里程新增
     *
     * @param params
     * @return
     */
    Integer newDayMile(Map<String, Object> params);

    /**
     * 根据车辆和
     *
     * @param params
     * @return
     */
    List<RideLog> getMachineIdStartTime(Map<String, Object> params);

    /**
     * 骑行时长
     *
     * @param params
     * @return
     */
    List<Integer> getMachineIdTime(Map<String, Object> params);

    /**
     * 查询用户最近一条订单
     *
     * @param userId
     * @return
     */
    RideLog queryLatestRideLog(@Param("userId") Integer userId);

    /**
     * 获取当前时间后最新一条骑行记录的开始时间
     * @param time
     * @param machineId
     * @return
     */
    Date getAfterLatest(@Param("time") String time, @Param("machineId") Integer machineId);

    Page<RideLog> selectRideLogPage(IPage<RideLog> page, @Param("reqVO") RideLogReqVO reqVO);

    /**
     * 根据车辆编号查询最近骑行用户
     *
     * @param machineId    设备id
     * @param regionId    分区id
     * @param pageNO 页码
     * @param rowCount 条数
     * @return List {@link RideLog}
     */
    List<RideLog> getRecentUserByUserCode(Integer machineId, Integer regionId, Integer pageNO, Integer rowCount);

    /**
     * 获取今日订单信息
     * @param dto dto
     * @return GetDataVO
     */
    GetDataVO getTodayCount(TodoItemsDTO dto);
    /**
     * 根据用户id查询用户最近一笔订单
     *
     * @param userId 用户id
     * @return RideLog
     */
    RideLog getRecentOrderByUserId(Integer userId);
}